之前在試做一些小專案的時候,就遇到需要在兩個 view 之間傳值的問題,聽說方法很多種,但傳值有分正向傳值和逆向傳值,所謂的正向傳值就是指第一個 view 傳到第二個 view,而逆向傳值就是從第二個 view 傳回給第一個 view,可用於逆向傳值的方法就代表正向傳值也可以使用,但正向傳值就不一定可以使用於逆向傳值了,正向和逆向傳值得方法似乎很多種,但一時間也無法消化這麼多種的方法,所以這邊就將介紹一個正向和兩個逆向傳值的方式,今天先介紹正向傳值,逆向傳值就留到壓軸吧!
昨天介紹了轉場的方法,有兩個方式就是利用 segue 的方式來實現轉場,可利用搭配 segue 的原生內建方法來達到傳值的效果。
先建立好兩個 views,並且在第一個 view 上建立一個 textfield 提供輸入文字,第二個 view 中,放一個 label,用來顯示第一個 view 中輸入的值,接著拉好 segue 並且將 identifier 命名為 "gotoSecondVC"
接著為第二個 view 建立一個新的 view controller
選 Cocoa Touch Class
Subclass of 記得選為 UIViewController
把剛建立好的檔案與 Storyboard 第二個畫面連結
最後把分別把兩個 views 中的 outlets 連結好後就在第一個 view controller 中利用方法 prepare(segue: sender:)
來設定傳值,原本很天真的直接呼叫目的地的變數來使用,結果直接 crash,實際程式碼如下:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "gotoSecondVC" {
if let destinationController = segue.destination as? SecondViewController {
if let text = textField.text {
destinationController.textLabel.text = text
}
}
}
}
在查找錯誤的時候,發現 destinationController.textLabel
會是 nil
值,代表此時 second view 中的物件還沒有生成,所以無法將值順利寫到 second view 的 label 中,解決的方式就是在 second view 中加入一個變數,並在 viewDidLoad()
的時候,把變數指定給 label 的 text,以下是程式碼:
In first view controller
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "gotoSecondVC" {
if let destinationController = segue.destination as? SecondViewController {
if let text = textField.text {
// Can't directly use this object because it's not create yet
// destinationController.textLabel.text = text
destinationController.showText = text
}
}
}
}
In second view controller
var showText: String!
override func viewDidLoad() {
super.viewDidLoad()
textLabel.text = showText
}
實際執行結果